package cn.itcast.web.controller.cargo;


import cn.itcast.domain.cargo.ContractProduct;
import cn.itcast.domain.cargo.ContractProductExample;
import cn.itcast.domain.cargo.Factory;
import cn.itcast.domain.cargo.FactoryExample;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.service.cargo.FactoryService;
import cn.itcast.web.controller.BaseController;
import cn.itcast.web.utils.FileUploadUtil;
import com.alibaba.dubbo.config.annotation.Reference;
import com.github.pagehelper.PageInfo;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.List;

@Controller
@RequestMapping("/cargo/contractProduct")
public class ContractProductController extends BaseController {

    @Reference
    private ContractProductService contractProductService;

    @Reference
    private FactoryService factoryService;

    /*
    url：/cargo/contractProduct/list.do?contractId=2e25cd5d-86a2-4191-8232-c4f1ee2dd96f
    作用：查询货物列表
    参数： contractId 购销合同的id
    返回值： 货物列表页面(cargo/product/product-list.jsp)
  */
    @RequestMapping("/list")
    public String list(String contractId,@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "5") Integer pageSize){
        //1. 查询货物列表
        //创建货物的条件
        ContractProductExample contractProductExample = new ContractProductExample();
        //把该购销合同的货物查询出来
        contractProductExample.createCriteria().andContractIdEqualTo(contractId);
        PageInfo<ContractProduct> pageInfo = contractProductService.findByPage(contractProductExample,pageNum,pageSize);
        request.setAttribute("pageInfo",pageInfo);

        //2., 查询生产货物的厂家
        FactoryExample factoryExample = new FactoryExample();
        //添加条件
        factoryExample.createCriteria().andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(factoryExample);
        request.setAttribute("factoryList",factoryList);

        //3. 把购销合同的id存储到请求域中
        request.setAttribute("contractId",contractId);

        //3. 回到页面
        return "cargo/product/product-list";

    }



    @Autowired
    private FileUploadUtil fileUploadUtil;

    /*
     url：/cargo/contractProduct/edit.do
     作用：保存添加与保存修改
     参数：货物对象
     返回值： 货物列表
  */
    @RequestMapping("/edit")
    public String edit(ContractProduct contractProduct,MultipartFile productPhoto) throws Exception { //文件上传的字段的数据类型一定要是MultipartFile
        //补充数据，因为这些数据是来自于登陆者
        String companyId = getLoginUserCompanyId();
        String companyName= getLoginUserCompanyName();
        contractProduct.setCompanyId(companyId);
        contractProduct.setCompanyName(companyName);
        //货物的创建人
        contractProduct.setCreateBy(getLoginUser().getId());
        //货物创建人所属的部门
        contractProduct.setCreateDept(getLoginUser().getDeptId());

        //通过上传文件的大小判断用户是否有上传
        if(productPhoto.getSize()>0){
            //1、把文件上传到七牛云，货物对象保存七牛云的图片的地址
            String url = fileUploadUtil.upload(productPhoto); //返回的就是图片在七牛上的地址
            contractProduct.setProductImage("http://"+url);
        }

        //1.判断contractProduct是否携带id过来，如果没有携带则是添加
        if(StringUtils.isEmpty(contractProduct.getId())){
            contractProductService.save(contractProduct);
        }else {
            //2. 如果携带id过来则是修改
            contractProductService.update(contractProduct);
        }
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractProduct.getContractId();
    }


    /*
        url：/cargo/contractProduct/toUpdate.do?id=100101
        作用：进入货物修改页面
        参数：货物id
        返回值：cargo/contractProduct/contractProduct-update.jsp
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        //1. 根据id查询货物
        ContractProduct contractProduct = contractProductService.findById(id);
        request.setAttribute("contractProduct",contractProduct);

        //2. 厂家
        FactoryExample factoryExample = new FactoryExample();
        factoryExample.createCriteria().andCtypeEqualTo("货物");
        List<Factory> factoryList = factoryService.findAll(factoryExample);
        request.setAttribute("factoryList",factoryList);

        //3. 返回更新页面
        return "cargo/product/product-update";

    }

    /*
     url：${ctx}/cargo/contractProduct/delete.do?id=${o.id}&contractId=${o.contractId}
     作用：删除货物
     参数：货物id, 购销合同的id
     返回值：购销列表
  */
    @RequestMapping("/delete")
    public String delete(String id,String contractId){
         contractProductService.delete(id);
        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
    }


    /*
       url：/cargo/contractProduct/toImport.do?contractId=fca56fc5-77ce-4e13-a358-141ce6cb49d5
       作用：进入上传货物的页面
       参数：contractId 购销合同的id
       返回值：cargo/product/product-import
    */
    @RequestMapping("/toImport")
    public String toImport(String contractId){
        request.setAttribute("contractId",contractId);
        return "cargo/product/product-import";
    }


    /*
      url：/cargo/contractProduct/import.do
      作用：保存上传货物
      参数：contractId 购销合同的id,file  上传excel
      返回值：货物列表
    */
    @RequestMapping("/import")
    public String importExcel(String contractId,MultipartFile file) throws IOException {
        //1. 创建工作薄
        Workbook workbook = new XSSFWorkbook(file.getInputStream());

        //2. 得到工作单
        Sheet sheet = workbook.getSheetAt(0);

        //3. 得到行数
        int rows = sheet.getPhysicalNumberOfRows();

        //4. 遍历所有的行，从第1行开始遍历,每一行我们都会创建一个COntractProduct对象，然后把行的数据封装到COntractProduct对象
        for (int i = 1; i < rows; i++) {
            //得到行
            Row row = sheet.getRow(i);
            //每一行对应一个ContractProduct
            ContractProduct contractProduct = new ContractProduct();
            //取出行里面单元格数据
            // /厂家名字
            String factoryName = row.getCell(1).getStringCellValue();
            if(factoryName!=null){
                contractProduct.setFactoryName(factoryName);
                //补充一个数据，补充厂家id
                Factory factory = factoryService.findByName(factoryName);
                contractProduct.setFactoryId(factory.getId());
            }
            //货号
            String productNo = row.getCell(2).getStringCellValue();
            if(productNo!=null){
                contractProduct.setProductNo(productNo);
            }

            //数量
            Double cnumber= row.getCell(3).getNumericCellValue();
            if(cnumber!=null){
                contractProduct.setCnumber(cnumber.intValue());
            }


            //货号
            String packingUnit = row.getCell(4).getStringCellValue();
            if(packingUnit!=null){
                contractProduct.setPackingUnit(packingUnit);
            }


            //装率
            Double loadingRate = row.getCell(5).getNumericCellValue();
            if(loadingRate!=null){
                contractProduct.setLoadingRate(loadingRate+"");
            }


            //箱数
            Double boxNum = row.getCell(6).getNumericCellValue();
            if(boxNum!=null){
                contractProduct.setBoxNum(boxNum.intValue());
            }

            //单价
            Double price = row.getCell(7).getNumericCellValue();
            if(price!=null){
                contractProduct.setPrice(price);
            }


            //货号
            String productDesc = row.getCell(8).getStringCellValue();
            if(productDesc!=null){
                contractProduct.setProductDesc(productDesc);
            }

            //要求
            String productRequest = row.getCell(9).getStringCellValue();
            if(productRequest!=null){
                contractProduct.setProductRequest(productRequest);
            }
            //补充一个数据，该货物所属的购销合同
            contractProduct.setContractId(contractId);
            //5. 调用ContractProductService保存方法
            contractProductService.save(contractProduct);
        }

        return "redirect:/cargo/contractProduct/list.do?contractId="+contractId;
    }
}
